CMSimfly 動態系統的網際編輯器採用 TinyMCE4, 可以放入一般超文件, 納入圖檔, 嵌入影片連結, 並且加入帶有行數的原始碼.
透過 File Upload 功能, 可以一次上傳多個檔案, 存入 downloads 目錄中儲存, 之後各頁面可以引入對應連結.
而圖檔的上傳與引用與一般檔案類似, 但上傳後存入 images 目錄中.
CMSimfly 目前使用 Syntaxhighlighter 3.0.83:
http://alexgorbatchev.com/SyntaxHighlighter/
進行頁面中的程式碼高亮顯示.
import java.util.Scanner;
public class Life {
public static void show(boolean[][] grid){
String s = "";
for(boolean[] row : grid){
for(boolean val : row)
if(val)
s += "*";
else
s += ".";
s += "\n";
}
System.out.println(s);
}
public static boolean[][] gen(){
boolean[][] grid = new boolean[10][10];
for(int r = 0; r < 10; r++)
for(int c = 0; c < 10; c++)
if( Math.random() > 0.7 )
grid[r][c] = true;
return grid;
}
public static void main(String[] args){
boolean[][] world = gen();
show(world);
System.out.println();
world = nextGen(world);
show(world);
Scanner s = new Scanner(System.in);
while(s.nextLine().length() == 0){
System.out.println();
world = nextGen(world);
show(world);
}
}
public static boolean[][] nextGen(boolean[][] world){
boolean[][] newWorld
= new boolean[world.length][world[0].length];
int num;
for(int r = 0; r < world.length; r++){
for(int c = 0; c < world[0].length; c++){
num = numNeighbors(world, r, c);
if( occupiedNext(num, world[r][c]) )
newWorld[r][c] = true;
}
}
return newWorld;
}
public static boolean occupiedNext(int numNeighbors, boolean occupied){
if( occupied && (numNeighbors == 2 || numNeighbors == 3))
return true;
else if (!occupied && numNeighbors == 3)
return true;
else
return false;
}
private static int numNeighbors(boolean[][] world, int row, int col) {
int num = world[row][col] ? -1 : 0;
for(int r = row - 1; r <= row + 1; r++)
for(int c = col - 1; c <= col + 1; c++)
if( inbounds(world, r, c) && world[r][c] )
num++;
return num;
}
private static boolean inbounds(boolean[][] world, int r, int c) {
return r >= 0 && r < world.length && c >= 0 &&
c < world[0].length;
}
}
def parse_content():
"""use bs4 and re module functions to parse content.htm"""
#from pybean import Store, SQLiteWriter
# if no content.db, create database file with cms table
'''
if not os.path.isfile(config_dir+"content.db"):
library = Store(SQLiteWriter(config_dir+"content.db", frozen=False))
cms = library.new("cms")
cms.follow = 0
cms.title = "head 1"
cms.content = "content 1"
cms.memo = "first memo"
library.save(cms)
library.commit()
'''
# if no content.htm, generate a head 1 and content 1 file
if not os.path.isfile(config_dir+"content.htm"):
# create content.htm if there is no content.htm
File = open(config_dir + "content.htm", "w", encoding="utf-8")
File.write("<h1>head 1</h1>content 1")
File.close()
subject = file_get_contents(config_dir+"content.htm")
# deal with content without content
if subject == "":
# create content.htm if there is no content.htm
File = open(config_dir + "content.htm", "w", encoding="utf-8")
File.write("<h1>head 1</h1>content 1")
File.close()
subject = "<h1>head 1</h1>content 1"
# initialize the return lists
head_list = []
level_list = []
page_list = []
# make the soup out of the html content
soup = bs4.BeautifulSoup(subject, 'html.parser')
# 嘗試解讀各種情況下的標題
soup = _remove_h123_attrs(soup)
# 改寫 content.htm 後重新取 subject
with open(config_dir + "content.htm", "wb") as f:
f.write(soup.encode("utf-8"))
subject = file_get_contents(config_dir+"content.htm")
# get all h1, h2, h3 tags into list
htag= soup.find_all(['h1', 'h2', 'h3'])
n = len(htag)
# get the page content to split subject using each h tag
temp_data = subject.split(str(htag[0]))
if len(temp_data) > 2:
subject = str(htag[0]).join(temp_data[1:])
else:
subject = temp_data[1]
if n >1:
# i from 1 to i-1
for i in range(1, len(htag)):
head_list.append(htag[i-1].text.strip())
# use name attribute of h* tag to get h1, h2 or h3
# the number of h1, h2 or h3 is the level of page menu
level_list.append(htag[i-1].name[1])
temp_data = subject.split(str(htag[i]))
if len(temp_data) > 2:
subject = str(htag[i]).join(temp_data[1:])
else:
subject = temp_data[1]
# cut the other page content out of htag from 1 to i-1
cut = temp_data[0]
# add the page content
page_list.append(cut)
# last i
# add the last page title
head_list.append(htag[n-1].text.strip())
# add the last level
level_list.append(htag[n-1].name[1])
temp_data = subject.split(str(htag[n-1]))
# the last subject
subject = temp_data[0]
# cut the last page content out
cut = temp_data[0]
# the last page content
page_list.append(cut)
return head_list, level_list, page_list
請注意, 目前 CMSimfly 標題內文無法解讀 "/" 符號, 因此若本頁面的標題為 "C/C++程式碼", 則無法進行分頁.
/* Runge Kutta for a set of first order differential equations */
#include <stdio.h>
#include <math.h>
#define N 2 /* number of first order equations */
#define dist 0.1 /* stepsize in t*/
#define MAX 30.0 /* max for t */
FILE *output; /* internal filename */
FILE *output1; /* internal filename */
// 利用 pipe 呼叫 gnuplot 繪圖
FILE *pipe;
void runge4(double x, double y[], double step); /* Runge-Kutta function */
double f(double x, double y[], int i); /* function for derivatives */
void main(){
double t, y[N];
int j;
output=fopen("osc.dat", "w"); /* external filename */
output1=fopen("osc1.dat", "w"); /* external filename */
y[0]=1.0; /* initial position */
y[1]=0.0; /* initial velocity */
//fprintf(output, "0\t%f\n", y[0]);
for (j=1; j*dist<=MAX ;j++) /* time loop */{
t=j*dist;
runge4(t, y, dist);
fprintf(output, "%f\t%f\n", t, y[0]);
fprintf(output1, "%f\t%f\n", t, y[1]);
}
fclose(output);
fclose(output1);
pipe = popen("gnuplot -persist","w");
//fprintf(pipe,"set term png enhanced font \"v:/fireflysung.ttf\" 18 \n");
fprintf(pipe,"set term png enhanced font \"y:/wqy-microhei.ttc\" 18 \n");
//fprintf(pipe,"set yrange [68:70]\n");
fprintf(pipe,"set output \"test.png\"\n");
fprintf(pipe, "plot \"osc.dat\" title \"位移\" with lines, \"osc1.dat\" title \"速度\" with lines\n");
fprintf(pipe,"quit\n");
fprintf(pipe,"quit\n");
pclose(pipe);
}
void runge4(double x, double y[], double step){
double h=step/2.0, /* the midpoint */
t1[N], t2[N], t3[N], /* temporary storage arrays */
k1[N], k2[N], k3[N],k4[N]; /* for Runge-Kutta */
int i;
for (i=0;i<N;i++){
t1[i]=y[i]+0.5*(k1[i]=step*f(x,y,i));
}
for (i=0;i<N;i++){
t2[i]=y[i]+0.5*(k2[i]=step*f(x+h, t1, i));
}
for (i=0;i<N;i++){
t3[i]=y[i]+ (k3[i]=step*f(x+h, t2, i));
}
for (i=0;i<N;i++){
k4[i]= step*f(x+step, t3, i);
}
for (i=0;i<N;i++){
y[i]+=(k1[i]+2*k2[i]+2*k3[i]+k4[i])/6.0;
}
}
double f(double x, double y[], int i){
if (i==0)
x=y[1]; /* derivative of first equation */
if (i==1)
x=-y[0]-0.5*y[1];
return x;
}
-- 導入 js 模組
js = require("js")
-- 取得 window
window = js.global
-- 猜小於或等於 n 的整數
big = 100
-- 計算猜測次數, 配合 while 至少會猜一次
num = 1
-- 利用 window:prompt 方法回應取得使用者所猜的整數
guess = window:prompt("請猜一個介於 1 到 "..big.." 的整數")
-- 利用數學模組的 random 函數以亂數產生答案
answer = math.random(big)
output = ""
-- 若沒猜對, 一直猜到對為止
while answer ~= tonumber(guess) do
if answer > tonumber(guess) then
output = "猜第 "..num.." 次, guess="..guess..", answer="..answer.." - too small"
print(output)
else
output = "猜第 "..num.." 次, guess="..guess..", answer="..answer.." - too big"
print(output)
end
guess = window:prompt(output..", 請猜一個介於 1 到 "..big.." 的整數")
num = num + 1
end
print("總共猜了 "..num.." 次, answer=guess="..answer.." - correct")
STLViewer = function(stlpath, plotarea) {
var mycanvas = document.getElementById(plotarea);
var viewer = new JSC3D.Viewer(mycanvas)
var theScene = new JSC3D.Scene;
////Initialize with a default file:
//var stlpath = "../../../assets/2013-10-23/stl/box.STL"
//var stlpath = "../../../assets/2013-10-23/stl/taj.stl"
viewer.setParameter('SceneUrl', stlpath);
viewer.setParameter('InitRotationX', 20);
viewer.setParameter('InitRotationY', 20);
viewer.setParameter('InitRotationZ', 0);
viewer.setParameter('ModelColor', '#CAA618');
viewer.setParameter('BackgroundColor1', '#FFFFFF');
viewer.setParameter('BackgroundColor2', '#383840');
viewer.init();
viewer.update();
////init done
var canvas_drop = document.getElementById('canvas-drop')
/*var dropzone = document.getElementById('dropzone')
dropzone.addEventListener('dragover', handleDragOver, false);
dropzone.addEventListener('drop', handleFileSelect, false); */
canvas_drop.addEventListener('dragover', handleDragOver, false);
canvas_drop.addEventListener('drop', handleFileSelect, false);
////Drag and drop logic:
function handleFileSelect(evt) {
evt.stopPropagation();
evt.preventDefault();
var files = evt.dataTransfer.files;
console.log(evt)
console.log(files)
preview_stl(files[0])
}
function handleDragOver(evt) {
evt.stopPropagation();
evt.preventDefault();
evt.dataTransfer.dropEffect = 'copy';
}
////jsc3d logic
var handle_file_select = function(e) {
e.stopPropagation()
e.preventDefault()
var f = e.target.files[0]
preview_stl(f)
}
function preview_stl(f) {
var reader = new FileReader()
var ext = f.name.split(".")[1]
function setup_viewer() {
viewer.setParameter('InitRotationX', 20);
viewer.setParameter('InitRotationY', 20);
viewer.setParameter('InitRotationZ', 0);
viewer.setParameter('ModelColor', '#CAA618');
viewer.setParameter('BackgroundColor1', '#FFFFFF');
viewer.setParameter('BackgroundColor2', '#383840');
viewer.setParameter('RenderMode', "flat");
}
setup_viewer()
reader.onload = (function(file) {
return function(e) {
theScene = new JSC3D.Scene
stl_loader = new JSC3D.StlLoader()
stl_loader.parseStl(theScene, e.target.result)
//viewer.init()
viewer.replaceScene(theScene)
viewer.update()
console.log("file reader onload")
}
})(f)
if (ext.toLowerCase() != "stl") {
alert("That doesn't appear to be an STL file.");
} else {
reader.readAsBinaryString(f)
}
}
}
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>CMSimfly</title>
<link rel="stylesheet" type="text/css" href="/static/cmsimply.css">
</head>
<body>
<div class='container'>
<nav>
<ul id='css3menu1' class='topmenu'>
<li><a href='/get_page/簡介'>簡介</a>
<li><a href='/get_page/目錄結構'>目錄結構</a>
<li>
<a href='/get_page/頁面編輯'>頁面編輯</a>
<ul>
<li>
<a href='/get_page/插入程式碼'>插入程式碼</a>
<ul>
<li><a href='/get_page/Java 程式碼'>Java 程式碼</a>
<li><a href='/get_page/Python 程式碼'>Python 程式碼</a>
<li><a href='/get_page/C或C++程式碼'>C或C++程式碼</a>
<li><a href='/get_page/Lua 程式碼'>Lua 程式碼</a>
<li><a href='/get_page/Javascript 程式碼'>Javascript 程式碼</a>
<li><a href='/get_page/Html 原始碼'>Html 原始碼</a></li>
</li>
</ul>
</ul>
<li><a href='/get_page/網際簡報'>網際簡報</a>
<li><a href='/get_page/網誌編輯'>網誌編輯</a>
<li><a href='/get_page/已知錯誤'>已知錯誤</a></li>
</ul>
</nav>
<section>
<form method='post' action='/ssavePage'>
<textarea class='simply-editor' name='page_content' cols='50' rows='15'><h3>Html 原始碼</h3></textarea>
<input type='hidden' name='page_order' value='9'>
<input type='submit' value='save'>
<input type=button onClick="location.href='/get_page/Html 原始碼'" value='viewpage'>
</form>
</section>
</body>
</html>
COPY TO CLIPBOARD